package modelo;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Edificio {
	
	protected static Map<TipoEdificio,RubroPista> map;
	protected ArrayList<Pista> pistas;
	protected boolean fueVisitado = false;
	protected Pista pistaEntregada = null;
	protected TipoEdificio tipoEdificio;
	
	
	public Edificio(TipoEdificio tipo){
		
		this.tipoEdificio = tipo;
		
		pistas = new ArrayList<Pista>();
		
	}
	
	protected void setMiPistaPorDificultad(TipoPista dificultad){
		
		if(!this.fueVisitado){
			this.fueVisitado = true;
			
			for(Pista pista : pistas){
				if(pista.getTipo() == dificultad){
					pista.accion(Juego.getInstancia().getPolicia());
					this.pistaEntregada = pista;
					break;
				}
			}
		}
	}
	
	public boolean haSidoVisitado(){
		return fueVisitado;
	}
	
	public void cargarPistas(List<Pista> pistasACargar)
	{
		for(Pista p : pistasACargar){
			if( p.getRubro() == getMyRubro() ){
				pistas.add(p);
			}
		}
	}
	
	public void agregarPistaRasgo(Pista pistaRasgo){
		agregarPistaRasgoPorDificultad(TipoPista.Facil, pistaRasgo);
		agregarPistaRasgoPorDificultad(TipoPista.Media, pistaRasgo);
		agregarPistaRasgoPorDificultad(TipoPista.Dificil, pistaRasgo);
	}
	
	protected void agregarPistaRasgoPorDificultad(TipoPista dificultad, Pista pistaRasgo){
		ArrayList<Pista> pistasSeleccionadas = new ArrayList<Pista>();
		
		for(Pista p : this.pistas){
			if(p.getTipo().equals(dificultad)){
				pistasSeleccionadas.add(p);
			}
		}
		
		if(!pistasSeleccionadas.isEmpty()){
			int random = (int) (Math.random() * pistasSeleccionadas.size());
			pistasSeleccionadas.get(random).agregarDetalleRasgo(pistaRasgo.getTexto());
		}
	}
	
	public RubroPista getMyRubro(){
		InicializarMap();
		return map.get(this.tipoEdificio);
	}

	private void InicializarMap() {
		if(map == null)
		{
			map = new HashMap<TipoEdificio,RubroPista>();
			map.put(TipoEdificio.Aeropuerto, RubroPista.Geografia);
			map.put(TipoEdificio.Banco, RubroPista.Economia);
			map.put(TipoEdificio.Bolsa, RubroPista.Economia);
			map.put(TipoEdificio.Biblioteca, RubroPista.Historia);
			map.put(TipoEdificio.Puerto, RubroPista.Geografia);
		}
	}

	public Pista darUnaPista(Novato unNovato) {
		
		this.setMiPistaPorDificultad(TipoPista.Facil);
		return this.pistaEntregada;
	}

	public Pista darUnaPista(Detective detective) {
		this.setMiPistaPorDificultad(TipoPista.Media);
		return this.pistaEntregada;
	}

	public Pista darUnaPista(Investigador investigador) {
		this.setMiPistaPorDificultad(TipoPista.Dificil);
		return this.pistaEntregada;
	}

	public Pista darUnaPista(Sargento sargento) {
		this.setMiPistaPorDificultad(TipoPista.Dificil);
		return this.pistaEntregada;
	}
	
	public TipoEdificio getTipoEdificio(){
		return this.tipoEdificio;
	}
	
	public List<Pista> getPistas(){
		return this.pistas;
	}

}
